package modelo.juego;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

import modelo.enemigos.CreadorEnemigo;
import modelo.enemigos.CreadorHormiga;
import modelo.enemigos.ManejadorEnemigos;
import modelo.interfaces.Manejador;
import modelo.mapa.Mapa;
import modelo.obstaculos.ManejadorObstaculos;
import modelo.torres.ManejadorTorres;

public final class Juego extends Thread implements Serializable {

	private static final long serialVersionUID = -338455945770701517L;
	// Atributos
	private static Juego instancia = null;
	private Mapa mapa;
	private Jugador jugador;
	private long latidos;
	private Collection<Manejador> manejables;
	private boolean pausado;

	// Metodos
	private Juego() {
		this.jugador = new Jugador();
		this.latidos = 0;
		this.mapa = new Mapa(Configuracion.TAMANIO_MAPA);
		this.manejables = new ArrayList<Manejador>();
		crearManejables(new CreadorHormiga());
		this.pausado = false;
	}
	
	public void crearManejables(CreadorEnemigo c) {
				
		Manejador manejadorEnemigos = new ManejadorEnemigos(this.mapa,
				this.jugador,30, c);
		Manejador manejadorTorres = new ManejadorTorres(this.mapa,
				manejadorEnemigos, this.jugador);
		Manejador manejadorObstaculos = new ManejadorObstaculos(this.mapa,
				manejadorEnemigos, this.jugador);

		this.manejables.add(manejadorEnemigos);
		this.manejables.add(manejadorTorres);
		this.manejables.add(manejadorObstaculos);
	}

	public void resetearJuego() {
		this.mapa = new Mapa(Configuracion.TAMANIO_MAPA);
		this.jugador = new Jugador();
		this.manejables = new ArrayList<Manejador>();
		this.mapa.setCamino();
		this.crearManejables(new CreadorHormiga());
		this.latidos = 0;
	}

	public static Juego ObtenerJuego() {
		if (instancia == null) {
			instancia = new Juego();
		}
		return instancia;
	}

	public Mapa getMapa() {
		return this.mapa;
	}
	
	public static void setInstancia(Juego j){
		if (instancia == null)
			instancia = j;
		
	}
	public Jugador getJugador() {
		return this.jugador;
	}

	public Collection<Manejador> getManejables() {
		return this.manejables;
	}

	public long getLatidos() {
		return this.latidos;
	}

	public boolean getPausado() {
		return pausado;
	}
	
	public void setPausado(boolean pausar) {
		this.pausado = pausar;
	}
	
	public void run() {

		while (jugador.getVida() > 0) {

			if (!pausado) {
			/*if (this.latidos == Configuracion.CAMBIO_DE_NIVEL1) {
				/*this.mapa = new Mapa(Configuracion.TAMANIO_MAPA);
				this.jugador = new Jugador();
				this.manejables = new ArrayList<Manejador>();
				//this.mapa.setCamino();
				this.crearManejables(new CreadorHormiga());			
			}*/
						

			Iterator<Manejador> it = this.manejables.iterator();
			while (it.hasNext()) {
				it.next().latir();
			}

			this.latidos++;
			System.out.println("" + this.latidos);
			try {
				sleep(50);
			}catch (InterruptedException e){
			}
		}
		}
	}
	
	public void redibujarComponentes() {
		Iterator<Manejador> it = manejables.iterator();
		while (it.hasNext()) {
			Manejador m = (Manejador) it.next();
			m.redibujarComponentes();
		}
	}

}
